package com.lz.sentinel.framework.config;

import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@Configuration
public class SentinelConfig implements InitFunc {
    @PostConstruct
    @Override
    public void init() {
        List<FlowRule> flowRuleList = new ArrayList<>();
        FlowRule rule = new FlowRule();
        // 设置资源名，需要与受保护的接口一致
        rule.setResource("bond");
        // 限流阈值类型（QPS）
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // 每秒最多允许 1  个请求
        rule.setCount(1);
        // 快速失败
        rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
        //rule.setMaxQueueingTimeMs(10);  // 请求最长等待时间（毫秒）
        flowRuleList.add(rule);

        FlowRule rule2 = new FlowRule();
        // 设置资源名，需要与受保护的接口一致
        rule2.setResource("otcOption");
        // 限流阈值类型（QPS）
        rule2.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // 每秒最多允许 1  个请求
        rule2.setCount(1);
        // 匀速排队模式（漏桶算法）
        rule2.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER);
        // 请求最长等待时间（毫秒）
        rule2.setMaxQueueingTimeMs(1000);
        flowRuleList.add(rule2);

        FlowRule rule3 = new FlowRule();
        // 设置资源名，需要与受保护的接口一致
        rule3.setResource("irSwap");
        // 限流阈值类型（并发线程数）
        rule3.setGrade(RuleConstant.FLOW_GRADE_THREAD);
        // 每秒最多允许 1  个请求
        rule3.setCount(1);
        flowRuleList.add(rule3);
        FlowRuleManager.loadRules(flowRuleList);
    }
}